home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / thesource-7.lha / Source / Articles / Stereoscopic / SegaGlasses.lha / SegaGlasses / mode_x.c < prev    next >
C/C++ Source or Header  |  1992-07-30  |  4KB  |  142 lines

  1. /*
  2.  
  3. VGA 320 * 400 * 256 * 2 frames routines.
  4.  
  5. Written by: F van der Hulst, 20/2/91
  6.  
  7. These routines display pixels in 320*400 mode by modifying the VGA
  8. registers, as outlined in Programmer's Journal V7.1 (Jan/Feb '89)
  9. article, pages 18-30, by Michael Abrash.
  10.  
  11. The advantage of 320 * 400, is that it gives two separate video pages,
  12. which can be displayed on the screen independently. These can contain
  13. two views of a scene, taken from slightly different viewpoints. These
  14. are displayed alternately on the screen, in sync with a pair of
  15. "chopper glasses", to give a 3D effect.
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <dos.h>
  20. #include "mode_x.h"
  21.  
  22.  
  23. /* Setvgapalette sets the entire 256 color palette     */
  24. /* PalBuf contains RGB values for all 256 colors       */
  25. /* R,G,B values range from 0 to 63                       */
  26. /* Taken from SVGA256.H, by Jordan Hargraphix Software */
  27.  
  28. void setvgapalette(Palette *PalBuf)
  29. {
  30.     struct REGPACK reg;
  31.  
  32.     reg.r_ax = 0x1012;
  33.     reg.r_bx = 0;
  34.     reg.r_cx = 256;
  35.     reg.r_es = FP_SEG(PalBuf);
  36.     reg.r_dx = FP_OFF(PalBuf);
  37.     intr(0x10,®);
  38. }
  39.  
  40.  
  41. unsigned int act_page = 0; /* Current page being written to */
  42.  
  43.  
  44. void writepixel(int x, int y, unsigned char colour)
  45. {
  46.     long addr;
  47.  
  48.     addr = ((x >> 2) + 320/4 * y + act_page);
  49.     addr = ((addr & 0xffff0000l) << 4) + (addr & 0xffffL) + ((long) VGA_SEGMENT << 16);
  50.     outport(SC_INDEX, (0x100 << (x & 3)) | MAP_MASK);
  51.     *(char far*)addr = colour;
  52. }
  53.  
  54. void set320x400mode(void)
  55. {
  56.     struct REGPACK regs;
  57.     unsigned char x;
  58.  
  59.     regs.r_ax = 0x13;                /* Set 320*200*256 graphics mode via BIOS */
  60.     intr(0x10, ®s);
  61.  
  62.     /*
  63.         Change CPU addressing of video memory to linear (not odd/even, chain,
  64.         or chain 4), to allow access to all 256K of display memory. Each byte
  65.         will now control one pixel, with 4 adjacent pixels at any given
  66.         address one pixel per plane.
  67.     */
  68.  
  69.     outportb(SC_INDEX, MEMORY_MODE);
  70.     x = inportb(SC_INDEX+1);
  71.     x &= 0xf7;                                    /* Turn off chain 4  */
  72.     x |= 4;                                        /* Turn off odd/even */
  73.     outportb(SC_INDEX+1, x);
  74.     outportb(GC_INDEX, GRAPHICS_MODE);
  75.     x = inportb(GC_INDEX+1);
  76.     x &= 0xef;                                    /* Turn off odd/even */
  77.     outportb(GC_INDEX+1, x);
  78.     outportb(GC_INDEX, MISCELLANEOUS);
  79.     x = inportb(GC_INDEX+1);
  80.     x &= 0xfd;                                    /* Turn off chain */
  81.     outportb(GC_INDEX+1, x);
  82.  
  83.     /*
  84.         Now clear the whole screen, since the mode 13h set only clears 64K. Do
  85.         thisbefore switching CRTC out of mode 13h, so that we don't see grabage
  86.         on the screen.
  87.     */
  88.  
  89.     outport(SC_INDEX, 0x0f00 | MAP_MASK);     /* Write to 4 planes at once */
  90.     setmem(MK_FP(VGA_SEGMENT, 0), 0xffff, 0);
  91.  
  92.     /* Change mode to 320*400 by not scanning each line twice. */
  93.  
  94.     outportb(CRTC_INDEX, MAX_SCAN_LINE);
  95.     x = inportb(CRTC_INDEX+1);
  96.     x &= 0xe0;                               /* Set maximum scan line to 0 */
  97.     outportb(CRTC_INDEX+1, x);
  98.  
  99.     /*  Change CRTC scanning from doubleword to byte mode, allowing the CRTC to
  100.         scan more than 64K
  101.     */
  102.     outportb(CRTC_INDEX, UNDERLINE);
  103.     x = inportb(CRTC_INDEX+1);
  104.     x &= 0xbf;                    /* Turn off doubleword */
  105.     outportb(CRTC_INDEX+1, x);
  106.     outportb(CRTC_INDEX, MODE_CONTROL);
  107.     x = inportb(CRTC_INDEX+1);
  108.     x |= 0x40;             /* Turn on the byte mode bit, so memory is linear */
  109.     outportb(CRTC_INDEX+1, x);
  110. }
  111.  
  112. void end320x400mode(void)
  113. {
  114.     struct REGPACK regs;
  115.  
  116.     regs.r_ax = 3;                          /* Return to text mode */
  117.     intr(0x10, ®s);
  118. }
  119.  
  120.  
  121. /* Set visible page */
  122.  
  123. void setvispage(int page)
  124. {
  125.     outport(CRTC_INDEX, (page << 15) | START_ADDRESS_HIGH);
  126. }
  127.  
  128.  
  129. /* Set active page (page being written to) */
  130.  
  131. void setactpage(int page)
  132. {
  133.     act_page = page ? 0x8000 : 0;
  134. }
  135.  
  136.  
  137. void WaitForVerticalRetrace(void)
  138. {
  139.     while (inportb(DISPIO) & VRT_bit);          /* wait */
  140.     while ((inportb(DISPIO) & VRT_bit) == 0);   /* wait */
  141. }
  142.